package com.zl.task.config;


import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.env.Environment;
import org.springframework.core.env.Profiles;
import springfox.documentation.builders.PathSelectors;
import springfox.documentation.builders.RequestHandlerSelectors;
import springfox.documentation.service.ApiInfo;
import springfox.documentation.service.Contact;
import springfox.documentation.spi.DocumentationType;
import springfox.documentation.spring.web.plugins.Docket;
import springfox.documentation.swagger2.annotations.EnableSwagger2;

import java.util.ArrayList;

/**
 * @author YinlinGeng
 */
@Configuration
@EnableSwagger2
public class SwaggerConfig {

    @Bean
    public Docket docket1(){
        return new Docket(DocumentationType.SWAGGER_2)
                .groupName("A");
    }

    @Bean
    public Docket docket2(){
        return new Docket(DocumentationType.SWAGGER_2)
                .groupName("B");
    }
    @Bean
    public Docket docket3(){
        return new Docket(DocumentationType.SWAGGER_2)
                .groupName("C");
    }


    //配置了Swapperbean实例
    @Bean
    public Docket docket(Environment environment){
        // 设置要显示的swagger环境
        Profiles profiles = Profiles.of("dev","test");
        //  通过环境监听查看自己是否处在设置的环境之中
        boolean flag = environment.acceptsProfiles(profiles);
        return new Docket(DocumentationType.SWAGGER_2)
                .apiInfo(apiInfo())
                .groupName("寅")
                //enable如果为false，则swagger就不能在浏览器中访问
                //enable的应用就主要在于，生产环境中使用swagger，发布时就不使用swagger，那么其实我们只用
                // 去改变这个enable的值就可以了
                .enable(flag)
                .select()
                //select和build是一套，apis和paths只能在select和build之间来配置
                //RequestHandlerSelectors  配置要扫描接口的方式
                //basePackage指定该扫描的包
                //RequestHandlerSelectors.any()扫描所有包
                //RequestHandlerSelectors.none()都不扫描
                //RequestHandlerSelectors.withClassAnnotation()扫描类上的注解需要传入一个反射出来的类
                //比如说传入一个xxx。class
                //RequestHandlerSelectors.withMethodAnnotation()扫描方法上的注解
                //因为有一些注解是用在类上的，有一些是放在方法上的比如@Controller这个注解就只能放在类上因
                // 此它只能放在RequestHandlerSelectors.withClassAnnotation()中
                //RequestHandlerSelectors.withClassAnnotation(RestController.class)就只会扫描有
                // RestController注解的类
                .apis(RequestHandlerSelectors.basePackage("com.zl.task.controller"))
                //paths代表可以过滤什么路径,只扫描带有yao下面请求的接口，打个比方RequestMapping("/hello")
                // 就不会被扫描，但是RequestMapping（"/yao/hello"）就可以被扫描
                .paths(PathSelectors.ant("controller/**"))
                //PathSelectors.any()就是什么都会扫描到，none()等等以此类推

                .build();
    }

    //配置Swagger信息，就是一些默认的配置信息
    private ApiInfo apiInfo(){
        //作者信息
        Contact contact = new Contact(
                "寅",
                "https://www.cnblogs.com/yaoyaoo/",
                "892095368@qq.com");
        return new ApiInfo(
                "寅的SwaggerApi",
                "爱7",
                "1.0",
                "https://www.cnblogs.com/yaoyaoo/",
                contact,
                //以下三个配置默认
                "Apache 2.0",
                "http://www.apache.org/licenses/LICENSE-2.0",
                new ArrayList());

    }
}